Preparation

Set Up

knitr::opts_chunk$set(
    message = FALSE,
    warning = FALSE,
    include = FALSE
)
# Load Libraries
library(tidyverse)
library(tidycensus)
library(sf)
library(kableExtra)
library(plotly)
library(tmap)

options(scipen=999)
options(tigris_class = "sf")

#Load qBr & q5 & theme & other source
source("https://raw.githubusercontent.com/urbanSpatial/Public-Policy-Analytics-Landing/master/functions.r")

# Load color palette
palette5 <- c("#f0f9e8","#bae4bc","#7bccc4","#43a2ca","#0868ac")

# Census API Key
census_api_key("ee5bb303d562a134a5fc2cdbc4ab53c8d0ca7629", overwrite = TRUE)

Wrangling 2009 & 2017 ACS Data

#2009data
tracts09 <-  
  get_acs(geography = "tract",
          variables = c("B02001_001E", #total population
                        "B19013_001E", #median HH income
                        "B25058_001E", #median rent
                        "B06012_002E", #total poverty
                        "B25001_001E", #HH units number
                        "B08301_001E", #total people commute
                        "B08301_012E"), #total people commute by subway
          year=2009, 
          state= "DC",
          geometry=TRUE,
          output="wide") %>% 
  st_transform('ESRI:102728') %>% 
  rename(
    TotalPop = B02001_001E,
    MedHHInc = B19013_001E, 
    MedRent = B25058_001E,
    TotalPoverty = B06012_002E,
    HHUnits = B25001_001E,
    TotalCommute = B08301_001E,
    SubwayCommute = B08301_012E
  ) %>% 
   mutate(pctRent = MedRent / MedHHInc *100,
         perHHUnitPop = TotalPop / HHUnits,
         pctPoverty = TotalPoverty / TotalPop*100,
         pctSubwayCommute = SubwayCommute / TotalCommute*100,
         year = "2009") %>%
    dplyr::select(-NAME, -TotalPoverty, -TotalCommute, -SubwayCommute, -starts_with("B"))

#2017data
tracts17 <-  
  get_acs(geography = "tract",
          variables = c("B02001_001E", #total population
                        "B19013_001E", #median HH income
                        "B25058_001E", #median rent
                        "B06012_002E", #total poverty
                        "B25001_001E", #HH units number
                        "B08301_001E", #total people commute
                        "B08301_012E"), #total people commute by subway
          year=2017, 
          state= "DC",
          geometry=TRUE,
          output="wide") %>% 
  st_transform('ESRI:102728') %>% 
  rename(
    TotalPop = B02001_001E,
    MedHHInc = B19013_001E, 
    MedRent = B25058_001E,
    TotalPoverty = B06012_002E,
    HHUnits = B25001_001E,
    TotalCommute = B08301_001E,
    SubwayCommute = B08301_012E
  ) %>% 
   mutate(pctRent = MedRent / MedHHInc *100,
         perHHUnitPop = TotalPop / HHUnits,
         pctPoverty = TotalPoverty / TotalPop*100,
         pctSubwayCommute = SubwayCommute / TotalCommute*100,
         year = "2017") %>%
    dplyr::select(-NAME, -TotalPoverty, -TotalCommute, -SubwayCommute, -starts_with("B"))

#combine 2009 & 2017
allTracts <- rbind(tracts09,tracts17)

Wrangling Subway Data

#Wrangling Subway Data
metroStops <- st_read("Metro_Stations_in_DC.geojson")%>%
  st_transform(st_crs(tracts09))

  metroStops$line <- ifelse(metroStops$LINE=="red"|metroStops$LINE=="green"|metroStops$LINE=="orange",metroStops$LINE,"transfer station")

ggplot() + 
  geom_sf(data=st_union(tracts09)) +
  geom_sf(data=metroStops, 
          aes(colour = line), 
          show.legend = "point", size= 2) +
  scale_colour_manual(values = c("red" = "#8E2323", "green" = "#426F42", "orange" = "#E47833","transfer station" = "#4F2F4F")) +
  labs(title="Metro Stops", 
       subtitle="Washington DC", 
       caption="Fig 1 (Source: opendata.dc.gov)") +
  mapTheme()

Create Buffer

#two kinds of buffer
stopBuffer <- st_buffer(metroStops, 2640)

stopUnion <- st_union(st_buffer(metroStops, 2640))

metroBuffers <- 
  rbind(
     stopBuffer %>%
      mutate(Legend = "Buffer") %>%
      dplyr::select(Legend),
     stopUnion %>%
      st_sf() %>%
      mutate(Legend = "Unioned Buffer"))

#visualization buffers
ggplot() +
  geom_sf(data = metroBuffers) +
  geom_sf(data = metroStops, show.legend = "point") +
  facet_wrap(~Legend) + 
  labs(caption = "Figure 2") +
  mapTheme()

Use Buffers to Visualize Spatial Population Data

# union buffer as filter
buffer <- filter(metroBuffers, Legend=="Unioned Buffer")

#clip
clip <- 
  st_intersection(buffer, tracts09) %>%
  dplyr::select(TotalPop) %>%
  mutate(Selection_Type = "Clip")

#spatial selection
spatialselection <- 
  tracts09[buffer,] %>%
  dplyr::select(TotalPop) %>%
  mutate(Selection_Type = "Spatial Selection")

#select by centroids
selectCentroids <-
  st_centroid(tracts09)[buffer,] %>%
  st_drop_geometry() %>%
  left_join(., dplyr::select(tracts09, GEOID), by = "GEOID") %>%
  st_sf() %>%
  dplyr::select(TotalPop) %>%
  mutate(Selection_Type = "Select by Centroids")

#Plotting the results of each method
intersections <- rbind(clip, spatialselection, selectCentroids)

ggplot() +
  geom_sf(data=intersections, aes(fill = TotalPop)) +
  geom_sf(data=metroStops, show.legend = "point") +
  scale_fill_viridis_c() +
  facet_wrap(~Selection_Type) + 
  labs(caption = "Figure 3(Source: opendata.dc.gov)") +
  mapTheme()

Brief Introduction

Early subway construction strategically positioned stations in densely populated areas, a decision that continues to exert a profound influence on contemporary population settlement patterns. As evidenced by the population distribution analysis, there is a noticeable aggregation of residents in the south-western region of Washington, D.C., and this spatial concentration closely aligns with the geographic distribution of subway stations. The daily commuter landscape in major metropolitan areas such as Washington is heavily reliant on the subway system, and transportation accessibility, coupled with economic considerations, serve as pivotal determinants for households, particularly those without access to private automobiles, in selecting their place of residence. Therefore, it is imperative to discern evolving population trends in Transit-Oriented Developments (TODs) and identify the driving forces behind these trends. Such an undertaking not only affords insights into and predictions for the developmental trajectory of TODs but also lends valuable support to the strategic planning of infrastructure initiatives within these areas, thereby enhancing the quality of life for vulnerable demographic segments.

TOD Indicators Analysis

TOD Indicators Visualizations

A comparative analysis of TOD distribution between 2009 and 2017, as illustrated in Figure 4, reveals a notable absence of significant changes during this period. Thus, it is apt to conduct a geometrical comparison between the two years.

The assessment of the percentage of household income allocated to rent serves as a crucial metric, shedding light on the financial burden borne by households and the degree of residents’ willingness to invest in transit amenities within each tract. Figure 5 indicates a prevailing trend across Washington, with most areas experiencing an escalation in the percentage of household income dedicated to rent from 2009 to 2017. This increase is particularly pronounced in southern and northern TODs, while the data remain relatively stable in eastern, south-eastern, and north-western TODs. Furthermore, certain mid-northern TODs even exhibit a slight decline. In contrast, non-TOD areas demonstrate an inverse pattern, with the indicator showing a noticeable decrease in eastern non-TODs and a slight rise in northern non-TODs. This suggests that residents in the eastern and southern sectors of Washington are not only more willing but also compelled to allocate a larger portion of their income to rent in exchange for convenient public transit access, while their counterparts in the northern areas exhibit less interest in transit-rich developments.

The indicator pertaining to the number of residents per household unit serves as a barometer of population density and spatial clustering. Figure 6 illustrates a reinforced inclination to reside in the northern, eastern, and southern suburban regions over the study period, with the western areas maintaining the lowest population density. It is noteworthy that TOD and non-TOD distributions appear to exert limited influence on resident distribution in Washington. In certain scenarios, such as mid-southern TODs, population density has even declined from Level 5 to Levels 2 or 1.

The indicator measuring the percentage of residents living below the poverty line provides insight into poverty distribution within the city. In comparison to the northern and western regions, poverty rates remain consistently higher in the southern and eastern areas, particularly in the southern part of Washington. This prevailing trend persists from 2009 to 2017, despite marginal improvements in overall city-level economic conditions in 2017. Examination of Figure 7 reveals evident economic advancement among households in mid-southern and eastern TODs, as indicated by a decrease in this indicator. Conversely, the percentage of poverty in non-TODs has slightly increased, especially in the eastern, northern, and north-western regions. This suggests an internal migration of poverty, with poverty-related issues becoming more acute in non-TOD areas over time.

Finally, the indicator reflecting the percentage of subway usage in total commuting offers valuable insights into the efficiency and frequency of local transit resources. A discernible trend emerges from Figure 8, indicating a rapid and substantial increase in overall subway commuting levels within Washington over the study period. Furthermore, a noteworthy shift in usage patterns between TOD and non-TOD areas becomes evident. Specifically, the percentage of subway usage in total commuting exhibits robust growth in non-TOD regions, while the increase in TODs is comparatively modest. In certain mid-northern TODs, there is even a decline in subway usage. This phenomenon results in a notable reversal of roles, wherein TODs have transitioned from being areas with high subway usage frequency to regions with lower usage rates, while non-TOD areas have emerged as the predominant subway commuters. In essence, individuals residing in TODs were more likely to use the subway for their daily commute in 2009, but eight years later, subway commuters are increasingly residing outside TODs, while those not utilizing the subway are more likely to be found within TODs.

#indicator of TOD / Non-TOD
allTracts.group <- 
  rbind(
    st_centroid(allTracts)[buffer,] %>%
      st_drop_geometry() %>%
      left_join(allTracts) %>%
      st_sf() %>%
      mutate(TOD = "TOD"),
    st_centroid(allTracts)[buffer, op = st_disjoint] %>%
      st_drop_geometry() %>%
      left_join(allTracts) %>%
      st_sf() %>%
      mutate(TOD = "Non-TOD")) %>%
  mutate(MedRent.inf = ifelse(year == "2009", MedRent * 1.14, MedRent)) 

#plot TOD change
ggplot() + 
  geom_sf(data = st_union(tracts09)) +
  geom_sf(data = allTracts.group,
          aes(fill = TOD)) +
  labs(title="2009 & 2017 TOD Distribution", 
       subtitle="Washington DC", 
       caption="Fig 4(Source: opendata.dc.gov)") +
  scale_fill_manual(values = c("TOD" = "#FEB35E", "Non-TOD" = "#81B2D4") ) +
  facet_wrap(~year)+
  #scale_colour_manual(values = c("TOD" = "#FEB35E", "Non-TOD" = "#81B2D4") ) +
  mapTheme()

#% of Income spent on Rent visualization
ggplot() + 
  geom_sf(data = st_union(tracts09)) +
  geom_sf(data = allTracts.group,
          aes(fill = q5(pctRent)
              ) )+
  geom_sf(data = buffer, fill = "transparent", color = "red") +
  labs(title="2009 & 2017 Percentage of Household Income Spent on Rent", 
       subtitle="Washington DC", 
       caption="Fig 5(Source: opendata.dc.gov)") +
  facet_wrap(~year)+
  scale_fill_manual(values = palette5 ) +
  mapTheme()

#People per Housing Unit visualization
ggplot() + 
  geom_sf(data = st_union(tracts09)) +
  geom_sf(data = allTracts.group,
          aes(fill = q5(perHHUnitPop)
              ) )+
  geom_sf(data = buffer, fill = "transparent", color = "red") +
  labs(title="2009 & 2017 People per Household Unit", 
       subtitle="Washington DC", 
       caption="Fig 6(Source: opendata.dc.gov)") +
  facet_wrap(~year)+
  scale_fill_manual(values = palette5 ) +
  mapTheme()

#poverty percentage visualization
ggplot() + 
  geom_sf(data = st_union(tracts09)) +
  geom_sf(data = allTracts.group,
          aes(fill = q5(pctPoverty)
              ) )+
  geom_sf(data = buffer, fill = "transparent", color = "red") +
  labs(title="2009 & 2017 Percentage of Poverty", 
       subtitle="Washington DC", 
       caption="Fig 7(Source: opendata.dc.gov)") +
  facet_wrap(~year)+
  scale_fill_manual(values = palette5 ) +
  mapTheme()

#% of subway commute in total visualization
ggplot() + 
  geom_sf(data = st_union(tracts09)) +
  geom_sf(data = allTracts.group,
          aes(fill = q5(pctSubwayCommute)) )+
  geom_sf(data = buffer, fill = "transparent", color = "red") +
  labs(title="2009 & 2017 Percentage of Subway in Total Commute Means", 
       subtitle="Washington DC", 
       caption="Fig 8(Source: opendata.dc.gov)") +
  facet_wrap(~year)+
  scale_fill_manual(values = palette5 ) +
  mapTheme()

TOD Indicator Tables

Tables 1 and 2 provide valuable insights into the changes observed in both TODs and non-TODs between 2009 and 2017. Notably, there is a corresponding increase in the mean rent and population in both TODs and non-TODs over this period, underscoring the persistence of internal differences in rent and population between these two categories.

Regarding the percentage of income allocated to rent, a noteworthy trend emerges as residents in non-TODs increasingly demonstrate a preference for dedicating a larger portion of their income to rent compared to residents in TODs. This aligns with the patterns observed in Figure 5. While Figure 6 may not provide a clear depiction of this trend, it is apparent from the data in Tables 1 and 2 that the metric of people per household unit has increased in TODs, indicative of a propensity for population aggregation.

Interestingly, the gap in poverty distribution between TODs and non-TODs has widened from 2009 to 2017, primarily driven by a significant reduction in poverty levels within TODs, while non-TOD areas have remained relatively stable in this regard.

It is worth noting that the analysis of the percentage of subway usage in total commuting reveals divergent findings compared to those inferred from Figure 8. While there is indeed an overall increase in subway usage for commuting at the city level, the data in Tables 1 and 2 suggest that the rise in subway usage for commuting has been more pronounced in TODs, making them the predominant areas for subway commuting in Washington. This discrepancy may be attributed to the methodology employed to delineate TODs and non-TODs, highlighting the importance of considering the classification method’s influence.

# TOD Indicator Tables years & TOD
allTracts.Summary <- 
  st_drop_geometry(allTracts.group) %>%
  group_by(year, TOD) %>%
  summarize(Rent = mean(MedRent, na.rm = T),
            Population = mean(TotalPop, na.rm = T),
            Percent_Income_on_Rent = mean(pctRent, na.rm = T),
            People_per_Household_Unit = mean(perHHUnitPop, na.rm = T),
            Percent_Poverty = mean(pctPoverty, na.rm = T),
            Percent_Subway_in_Commute = mean(pctSubwayCommute, na.rm = T))

kable(allTracts.Summary) %>%
  kable_styling(full_width = F, bootstrap_options = c("striped", "hover", "condensed") )%>%
  footnote(general_title = "\n",
           general = "Table 1(Source: opendata.dc.gov)")
year TOD Rent Population Percent_Income_on_Rent People_per_Household_Unit Percent_Poverty Percent_Subway_in_Commute
2009 Non-TOD 910.3922 3176.907 1.687277 Inf 18.38709 0.2698865
2009 TOD 968.2895 3066.588 1.821633 2.769167 17.63284 0.1916730
2017 Non-TOD 1285.7500 3667.280 2.034556 Inf 18.48403 0.2821114
2017 TOD 1537.9859 3888.778 1.853130 3.520949 14.90304 0.2886590

Table 1(Source: opendata.dc.gov)
# TOD Indicator Tables Variables
allTracts.Summary %>%
  unite(year.TOD, year, TOD, sep = ": ", remove = T) %>%
  gather(Variable, Value, -year.TOD) %>%
  mutate(Value = round(Value, 2)) %>%
  spread(year.TOD, Value) %>%
  kable() %>%
  kable_styling(full_width = F, bootstrap_options = c("striped", "hover", "condensed")) %>%
  footnote(general_title = "\n",
           general = "Table 2(Source: opendata.dc.gov)")
Variable 2009: Non-TOD 2009: TOD 2017: Non-TOD 2017: TOD
People_per_Household_Unit Inf 2.77 Inf 3.52
Percent_Income_on_Rent 1.69 1.82 2.03 1.85
Percent_Poverty 18.39 17.63 18.48 14.90
Percent_Subway_in_Commute 0.27 0.19 0.28 0.29
Population 3176.91 3066.59 3667.28 3888.78
Rent 910.39 968.29 1285.75 1537.99

Table 2(Source: opendata.dc.gov)

TOD Indicator Plots

The bar chart presented in Figure 9 offers a clear and direct insight into the disparities between various groups. Notably, the population residing in TODs has experienced rapid growth and has now surpassed that in non-TODs. This population trend aligns with the observed substantial increase in rent prices within TODs from 2007 to 2019.

Consequently, the number of people per household unit has seen a significant rise in TODs, while it has remained relatively stable in non-TODs. This trend mirrors the corresponding increase in the percentage of subway usage in total commuting in TODs compared to non-TODs.

Simultaneously, the percentage of income spent on rent has exhibited a substantial increase in non-TODs, in sharp contrast to TODs where this percentage has remained relatively stable. This trend, combined with the noteworthy reduction in poverty levels within TODs, leads to the conclusion that TODs have gradually evolved into communities that attract higher-income households, while lower-income families have been relocating to non-TODs.

# TOD Indicator four visualization Plots
allTracts.Summary %>%
  gather(Variable, Value, -year, -TOD) %>%
  ggplot(aes(year, Value, fill = TOD)) +
  geom_bar(stat = "identity", position = "dodge") +
  facet_wrap(~Variable, scales = "free", ncol=5) +
  scale_fill_manual(values = c("#bae4bc", "#0868ac")) +
  labs(title = "Indicator differences across time and space",
       subtitle="Washington DC", 
       caption="Fig 9(Source: opendata.dc.gov)") +
  plotTheme() + theme(legend.position="bottom")

Graduated Symbol Maps of Population and Rent within 0.5 mile of each Transit Station

Figures 10 and 11, which depict graduated symbol maps of population and rent within a 0.5-mile radius of each transit station, can be effectively merged into a unified representation, as seen in Figure 12. In Figure 12, a color scheme is employed to illustrate mean rent values, with a closer approximation to the color red indicating higher mean rent. Additionally, the size of each point on the map correlates with population density, with larger points signifying higher population density.

Upon examination of Figure 12, several key patterns emerge. Notably, there is a discernible trend of population aggregation and rent growth occurring most prominently in the central region of Washington. The northern part of the city exhibits a more pronounced increase in rent, while the southern area experiences a more notable population growth.

# change geometry into x & y
metroStopscoord <- metroStops %>% 
                  st_transform(st_crs('ESRI:102728')) %>% 
                  dplyr::mutate(x = sf::st_coordinates(.)[,1], 
                                y = sf::st_coordinates(.)[,2]) %>%
                  distinct(NAME, .keep_all=TRUE) %>%
                  dplyr::select(-LINE, -line)

#add x & y to the orginal data forming new data
new_allTracts.group <- allTracts.group %>% st_join(metroStopscoord)

#graduated symbol maps of population
ggplot() +
  geom_sf(data = new_allTracts.group, alpha = 0.4) +
  geom_point(data = new_allTracts.group, aes(x = x, y = y, size = TotalPop, color = "red"), alpha = 0.5) +
  scale_size_area(max_size = 15) + #size change
  #scale_color_gradient(low = "blue", high = "red") +  # color change
  geom_sf(data = metroStops, size = 1, color = "black") + #station point
  labs(title = "Population within 0.5 mi. of Subway Stations", 
       subtitle = "Washington, DC", 
       caption = "Fig 10(Source: US Census Bureau; opendata.dc.gov)") +
  facet_wrap(~year) +
  mapTheme()

#graduated symbol maps of rent
ggplot() +
  geom_sf(data = new_allTracts.group, alpha = 0.4) +
  geom_point(data = new_allTracts.group, aes(x = x, y = y, size = MedRent, color = "red"), alpha = 0.5) +
  scale_size_area(max_size = 15) + #size change
  #scale_color_gradient(low = "blue", high = "red") +  # color change
  geom_sf(data = metroStops, size = 1, color = "black") + #station point
  labs(title = "Rent within 0.5 mi. of Subway Stations", 
       subtitle = "Washington, DC", 
       caption = "Fig 11(Source: US Census Bureau; opendata.dc.gov)") +
  facet_wrap(~year) +
  mapTheme()

#or show the population & rent in one graduated symbol
ggplot() +
  geom_sf(data = new_allTracts.group, alpha = 0.4) +
  geom_point(data = new_allTracts.group, aes(x = x, y = y, size = TotalPop, color = MedRent), alpha = 0.5) +
  scale_size_area(max_size = 15) + #size change
  scale_color_gradient(low = "blue", high = "red") +  # color change
  geom_sf(data = metroStops, size = 1, color = "black") + #station point
  labs(title = "Population and Rent within 0.5 mi. of Subway Stations", 
       subtitle = "Washington, DC", 
       caption = "Fig 12(Source: US Census Bureau; opendata.dc.gov)") +
  facet_wrap(~year) +
  mapTheme()

Geomline Plot Shows Mean Rent as a Function of Distance to Transit Stations

The overall trend in mean rent as a function of distance from transit stations exhibits a distinctive wave-like pattern characterized by two prominent peaks. The initial peak occurs at approximately zero miles, representing the epicenter of the TOD area, followed by a relatively smooth fluctuation in mean rent values up to a distance of around 2 miles. The second peak emerges at roughly 2-2.5 miles, after which mean rent experiences a rapid decline.

A comparison between the years 2009 and 2017 reveals notable disparities in rent fluctuations. Firstly, the average standard of mean rent in 2017 significantly surpasses that of 2009. Secondly, the amplitude of the rent fluctuations has also expanded, with the difference between the highest and lowest mean rent points reaching nearly 1000($) in 2017, compared to approximately 300 in 2009. Furthermore, the variations in mean rent have become more pronounced over time, as evidenced by the second peak in mean rent shifting from 2 miles in 2009 to 2.5 miles in 2017.

allTracts <- rbind(tracts17,tracts09)
metro_MRB <- multipleRingBuffer(st_union(metroStops), 47520, 2640)

allTracts.rings <-
  st_join(st_centroid(dplyr::select(allTracts, GEOID, year)),
          metro_MRB) %>%
  st_drop_geometry() %>%
  left_join(dplyr::select(allTracts, GEOID, MedRent, year), 
            by=c("GEOID"="GEOID", "year"="year")) %>%
  st_sf() %>%
  mutate(distance = distance / 5280) #convert to miles

#multipleRingBuffer visualization
  ggplot() +
    geom_sf(data=metro_MRB) +
    geom_sf(data=metroStops, size=1) +
    geom_sf(data=st_union(tracts17), fill=NA, size=1.2) +
    labs(title="Half mile buffers",
         subtitle="Washington DC", 
       caption="Fig 13(Source: opendata.dc.gov)") +
    mapTheme()

 allTracts.rings.summary <- st_drop_geometry(allTracts.rings) %>%
    group_by(distance, year) %>%
    summarize(Mean_Rent = mean(MedRent, na.rm=TRUE))

#geom_line plot
ggplot(allTracts.rings.summary,
       aes(distance, Mean_Rent, colour=year)) +
      geom_point(size=3) + 
  geom_line(size=2) +
  labs(title="Mean Rent as a Function of Distance to Transit Station",
         subtitle="Washington DC", 
       caption="Fig 14(Source: US Census Bureau; opendata.dc.gov)") 

Conclusion

Household Preferences for Transit-Rich Neighborhoods

The analysis suggests that households in Washington do value transit-rich neighborhoods. This is evident from the significant increase in the percentage of household income spent on rent in TODs, particularly in southern and northern TODs. Residents in these areas are willing to pay more for housing with convenient access to public transit. Besides, TODs have experienced population growth, surpassing that of non-TOD areas. This suggests that the availability of transit options in TODs is attractive to residents, leading to increased settlement in these neighborhoods. Furthermore, the analysis showing population aggregation and rent growth suggest that development and growth have been concentrated in the middle area of Washington. This might be related to the presence of transit options in these areas.

Economic Shift Influenced by Population in TODs

The decreasing poverty rates in middle, southern, and eastern TODs indicate that these areas are becoming more economically stable. This suggests that residents in TODs may have better access to economic opportunities, potentially due to their proximity to transit options. Also, residents in non-TODs have to allocate a larger proportion of their income towards rental expenses as compared to their counterparts inhabiting TODs. This could be due to factors such as improvements in housing quality in non-TOD areas, however, it predominantly stems from the migration of low-income individuals who either lack the financial capacity or exhibit a disinclination to bear the elevated rental costs associated with TODs, thereby relocating to non-TOD areas.

Spatial Biases and Margin of Error

The methods employed for calculating representative rent and income have the potential to introduce scale bias, as they may fail to accurately depict the data distribution and often overlook internal distribution balance. While the selection of centroids serves to mitigate errors stemming from spatial selection, it remains ineffective in rectifying the imbalanced value distribution within the census tract. Consequently, a margin of error may manifest during the analysis. However, it is noteworthy that the overall conclusions drawn from the analysis are likely to be minimally impacted by these factors, given that the margin of error is relatively small when compared to the entirety of the dataset.